﻿//This filter is tested and seems to work correctly

//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Drawing;

//namespace LowLevelGraphics.Filter
//{
//    /// <summary>
//    /// 
//    /// </summary>
//    public class Segmentation : BaseImageFilter
//    {
//        private PROCESSING_MODE M_MODE = PROCESSING_MODE.Color;
//        private int rTol = 10;
//        private int gTol = 10;
//        private int bTol = 10;

//        /// <summary>
//        /// 
//        /// </summary>
//        public Segmentation()
//            : this(10,10,10)
//        {
//        }

//        /// <summary>
//        /// 
//        /// </summary>
//        /// <param name="_rTol"></param>
//        /// <param name="_gTol"></param>
//        /// <param name="_bTol"></param>
//        public Segmentation(int _rTol, int _gTol, int _bTol)
//        {
//            rTol = _rTol;
//            gTol = _gTol;
//            bTol = _bTol;
//        }

//        public override void Execute(Bitmap _bitmap)
//        {
//            UnsafeBitmap bitmap = _bitmap;
//            List<Point> aPoint = new List<Point>(){
//                new Point(-1,-1), 
//                new Point(-1,0),
//                new Point(-1,1),
//                new Point(0,1),
//                new Point(1,0),
//                new Point(1,-1),
//                new Point(1,1),
//                new Point(0,-1)
//            };

//            List<Point> aPointToSet = new List<Point>();
//            Bitmap bm2 = new Bitmap(bitmap.Width, bitmap.Height);
//            Color color = Color.Transparent;
//            bool bFound = false;

//            for (int y = 1; y < bitmap.Height - 1; y++)
//            {
//                bFound = false;
//                for (int x = 1; x < bitmap.Width - 1; x++)
//                {
//                    color = bitmap.GetPixel(x, y);
//                    Color[] aColor = new Color[8];
//                    aColor = GetEnvironmentPixelColorArray(bitmap, x, y, aPoint, aColor);
//                    aPointToSet.Clear();
//                    for (int i = 0; i < aColor.Length; i++)
//                    {
//                        if (ColorFunctions.IsInColorTolerance(color, aColor[i], rTol, gTol, bTol))
//                        {
//                            int nX = x + aPoint[i].X;
//                            int nY = y + aPoint[i].Y;
//                            if (bm2.GetPixel(nX, nY) != Color.FromArgb(255, Color.Red))
//                            {
//                                aPointToSet.Add(new Point(nX, nY));
//                                bm2.SetPixel(nX, nY, Color.Red);
//                            }
//                        }
//                    }

//                    //TODO: integrate this foreach loop into the one before.
//                    for (int i = 0; i < aPointToSet.Count; i++)
//                    {
//                        int nX = aPointToSet[i].X;
//                        int nY = aPointToSet[i].Y;
//                        aColor = GetEnvironmentPixelColorArray(bitmap, nX, nY, aPoint, aColor);
//                        for (int j = 0; j < aColor.Length; j++)
//                        {
//                            if (ColorFunctions.IsInColorTolerance(color, aColor[j], rTol, gTol, bTol))
//                            {
//                                nX = nX + aPoint[j].X;
//                                nY = nY + aPoint[j].Y;
//                                if (nX < 0 || nX > bitmap.Width - 1 || nY < 0 || nY > bitmap.Height - 1)
//                                    continue;
//                                if (bm2.GetPixel(nX, nY) != Color.FromArgb(255, Color.Red))
//                                {
//                                    aPointToSet.Add(new Point(nX, nY));
//                                    bm2.SetPixel(nX, nY, Color.Red);
//                                }
//                            }
//                        }
//                    }

//                    for (int i = 0; i < aPointToSet.Count; i++)
//                    {
//                        bitmap.SetPixel(aPointToSet[i].X, aPointToSet[i].Y, color);
//                    }

//                    aPointToSet.Clear();
//                }
//            }
//            bitmap.Dispose();
//        }

//        public static Color[] GetEnvironmentPixelColorArray(UnsafeBitmap bitmap, int x, int y, List<Point> aPoint, Color[] _aColor)
//        {
//            for (int i = 0; i < aPoint.Count; i++)
//            {
//                int nX = x + aPoint[i].X;
//                int nY = y + aPoint[i].Y;
//                if (nX < 0 || nX > bitmap.Width - 1)
//                {
//                    continue;
//                }
//                if (nY < 0 || nY > bitmap.Height - 1)
//                {
//                    continue;
//                }
//                _aColor[i] = bitmap.GetPixel(nX, nY);
//            }
//            return _aColor;
//        }

//        public static Color[] GetEnvironmentPixelColorArray(IBitmap bitmap, int x, int y, List<Point> aPoint, Color[] _aColor)
//        {
//            for (int i = 0; i < aPoint.Count; i++)
//            {
//                int nX = x + aPoint[i].X;
//                int nY = y + aPoint[i].Y;
//                if (nX < 0 || nX > bitmap.Width - 1)
//                {
//                    continue;
//                }
//                if (nY < 0 || nY > bitmap.Height - 1)
//                {
//                    continue;
//                }
//                _aColor[i] = bitmap.GetPixel(nX, nY);
//            }
//            return _aColor;
//        }
//    }
//}
